package Modelo;

public class Caida implements Habilidad {
	
	private boolean ejecuto=false;
	
	public void ejecutarSobre(PoseedorDeHabilidad ejecutor) {
		Bloque anterior=ejecutor.getMapa().getBloqueDondeEsta(ejecutor);
		Bloque debajo= ejecutor.getMapa().getBloqueNEnDireccionDesdeUbicacionDe(ejecutor,1,Constantes.abajo);
		debajo.alojar(ejecutor);
		ejecutor.setVelocidad(debajo.velocidadFinal(ejecutor.getVelocidad()));
		anterior.desalojar(ejecutor);
		ejecutor.caer();
		ejecuto=true;
	}

	public boolean esEjecutableSobre(PoseedorDeHabilidad ejecutor) {
		try{
			if(!ejecutor.getMapa().getBloqueNEnDireccionDesdeUbicacionDe(ejecutor,1,Constantes.abajo).esFirme())
				return true;
		}
		catch(FueraDelMapaException e){
			// abajo no hay ningun bloque, supongo 	que cayo a un precipicio 
			// hasta el centro del planeta y se murio quemado
			Bloque b= ejecutor.getMapa().getBloqueDondeEsta(ejecutor);
			if(b!=null)
				b.desalojar(ejecutor);
			ejecutor.morir();
			return false;	
		}
		ejecutor.chocar();
		return false;	
	}

	public long tiempoDeEjecucion(PoseedorDeHabilidad ejecutor) {
		return Constantes.tiempoCiclo/(long)ejecutor.getMapa().getBloqueNEnDireccionDesdeUbicacionDe(ejecutor,1,Constantes.abajo).velocidadFinal(ejecutor.getVelocidad()).toReal();
	}

	@Override
	public boolean seEjecuto() {
		if(ejecuto==false)
			return false;
		ejecuto=false;
		return true;
	}

}
